package com.agentai.framework.common.utils.treenode;

import java.util.ArrayList;
import java.util.List;

/**
 * 树转换工具类
 *
 * @author yangfei
 * @date: 2020年3月8日 下午12:08:52
 */
public class TreeNodeUtil {

    /**
     * 传入list获取树状结构体
     *
     * @param topCode      顶级节点编号，一般为00
     * @param entityList   查询的list
     * @param explandLevel 树形展开的级别，顶级算1级，依次往下2.3.，传0则全部不展开
     * @return 返回结构体集合
     * @author yangfei 2020年3月8日 下午12:09:05
     */
    public static <E extends TreeInter<E>> List<E> getTreeList(String topCode, int explandLevel, List<E> entityList) {
        List<E> resultList = new ArrayList<>();
        // 获取顶层元素集合
        String parentCode;
        for (E entity : entityList) {
            parentCode = entity.getParentCode();
            if (null != parentCode && topCode.equals(parentCode)) {
                if (explandLevel > 0) {
                    entity.setIsExpland(true);
                } else {
                    entity.setIsExpland(false);
                }
                resultList.add(entity);
            }
        }
        // 获取每个顶层元素的子数据集合
//		int level = 1;
        for (E entity : resultList) {
            entity.setChildList(getSubList(topCode, explandLevel, entity.getCurCode(), entityList));
            /*
             * if(level<=explandLevel) { entity.setIsExpland(true); }else {
             * entity.setIsExpland(false); } level++;
             */
        }
        return resultList;
    }

    /**
     * * 获取子数据集合
     *
     * @param id
     * @param entityList
     * @return
     */
    private static <E extends TreeInter<E>> List<E> getSubList(String topCode, int explandLevel, String id, List<E> entityList) {
        List<E> childList = new ArrayList<>();
        String parentCode;
        // 子集的直接子对象
        for (E entity : entityList) {
            parentCode = entity.getParentCode();
            if (id.equals(parentCode)) {
                if (entity.getCurCode().length() / topCode.length() > explandLevel) {
                    entity.setIsExpland(false);
                } else {
                    entity.setIsExpland(true);
                }
                childList.add(entity);
            }
        }
        // 子集的间接子对象
        for (E entity : childList) {
            if (entity.getCurCode().length() / topCode.length() > explandLevel) {
                entity.setIsExpland(false);
            } else {
                entity.setIsExpland(true);
            }
            entity.setChildList(getSubList(topCode, explandLevel, entity.getCurCode(), entityList));
        }
        // 递归退出条件
        if (childList.size() == 0) {
            return new ArrayList<>();
        }
        return childList;
    }

}
